package com.heima.user.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.common.constants.UserConstants;
import com.heima.model.common.dtos.PageResponseResult;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dtos.AuthDto;
import com.heima.model.user.pojos.ApUserRealname;
import com.heima.user.mapper.ApUserRealnameMapper;
import com.heima.user.service.ApUserRealnameService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.TimeZone;

@Service
@Slf4j
@Transactional
public class ApUserRealnameServiceImpl extends ServiceImpl<ApUserRealnameMapper, ApUserRealname> implements ApUserRealnameService {

	@Autowired
	private ApUserRealnameMapper apUserRealnameMapper;

	/**
	 * 查询列表
	 *
	 * @param dto
	 * @return
	 */
	@Override
	public ResponseResult list(AuthDto dto) {
		//检查参数，判断参数是否为空，为空直接返回错误提示
		if (dto == null) {
			//直接提示参数错误
			return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
		}

		// 2. 检查分页，调用PageRequestDto的checkParam方法检查参数
		//dto是AuthDto的实例化对象，AuthDto又继承了PageRequestDto类
		//所以dto可以调用PageRequestDto类中的checkParam方法检查参数
		dto.checkParam();

		// 3. 模糊查询 + 分页
		//创建一个分页对象page，该对象需要两个参数：当前页码dto.getPage()和每页显示的记录数dto.getSize()
		//这表示查询的是第dto.getPage()页的数据，每页包含dto.getSize()条记录
		IPage page = new Page(dto.getPage(), dto.getSize());
		//创建一个LambdaQueryWrapper对象，用于封装查询条件
		//LambdaQueryWrapper是MyBatis-Plus提供的一个查询条件构造器，通过Lambda表达式来避免硬编码的字符串
		LambdaQueryWrapper<ApUserRealname> lambdaQueryWrapper = new LambdaQueryWrapper<>();
		//如果参数的状态字段不为空，将status纳入查询条件当中
		if (dto.getStatus() != null) {
			lambdaQueryWrapper.eq(ApUserRealname::getStatus, dto.getStatus());
		}

		//根据传入的page对象和lambdaQueryWrapper对象执行分页查询
		//查询结果会被填充到page对象中，包括总记录数、当前页的记录列表等信息
		page = page(page, lambdaQueryWrapper);

		// 4. 结果返回
		//创建一个PageResponseResult对象来封装查询结果，包括当前页码、每页显示的记录数、总记录数等信息
		ResponseResult responseResult = new PageResponseResult(dto.getPage(), dto.getSize(), (int) page.getTotal());
		//然后将查询到的记录列表调用setData方法设置到responseResult对象中
		responseResult.setData(page.getRecords());
		//最后，将responseResult对象返回给调用方，即前端
		return responseResult;
	}

	/**
	 * 审核失败
	 * @param dto
	 * @return
	 */
	@Override
	public ResponseResult authFail(AuthDto dto) {
		//首先判断参数是否为空或者id是否为空，为空则直接提示参数错误
		if (dto==null||dto.getId()==null){
			return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
		}
		//根据id从数据库中查询数据，判断数据是否存在
		ApUserRealname apUserRealnameDB = getById(dto.getId());
		if (apUserRealnameDB==null){
			return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
		}
		//将数据库中的状态更新为前端传递过来的状态，并且驳回的消息也需要更新
		apUserRealnameDB.setStatus(UserConstants.REVIEW_FAILED);
		apUserRealnameDB.setReason(dto.getMsg());
		apUserRealnameDB.setUpdatedTime(new Date());
		//将更改后的数据插入到数据库中
		saveOrUpdate(apUserRealnameDB);
		//给前端返回审核失败的提示
		return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
	}

	/**
	 * 审核成功
	 * @param dto
	 * @return
	 */
	@Override
	public ResponseResult authPass(AuthDto dto) {
		//首先判断参数是否为空或者id是否为空，为空则直接提示参数错误
		if (dto==null||dto.getId()==null){
			return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
		}
		//根据id从数据库中查询数据，判断数据是否存在
		ApUserRealname apUserRealnameDB = getById(dto.getId());
		if (apUserRealnameDB==null){
			return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
		}
		//将数据库中的状态更新为前端传递过来的状态,并且更新时间也需要变更
		apUserRealnameDB.setStatus(UserConstants.REVIEW_PASS);
		apUserRealnameDB.setReason("");
		// 获取当前时间并调整为北京时间
		apUserRealnameDB.setUpdatedTime(new Date());
		//apUserRealnameDB.setUpdatedTime(new Date());
		//将更改后的数据插入到数据库中
		saveOrUpdate(apUserRealnameDB);
		//给前端返回审核成功的提示
		return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
	}
}
